#include <iostream>
#include <vector>

using namespace std;

const int N = 10;

struct node
{
    int a, b;
    string s;
};

void print(vector<int>& a)
{
    // 利用 size 来遍历
    // for(int i = 0; i < a.size(); i++)
    // {
    //     cout << a[i] << " ";
    // }
    // cout << endl;

    // 利用迭代器来遍历 - 迭代器类型 vector<int>::iterator
    // for(auto it = a.begin(); it != a.end(); it++)
    // {
    //     cout << *it << " ";
    // }
    // cout << endl;

    // 使用语法糖 - 范围 for
    for(auto x : a)
    {
        cout << x << " ";
    }
    cout << endl;
}

int main()
{
    // 1. 创建 vector
    vector<int> a1; // 创建了一个名字为 a1 的空的可变长数组，里面都是 int 类型的数据
    vector<int> a2(N); // 创建了一个大小为 10 的可变长数组，里面的值默认都是 0
    vector<int> a3(N, 2); // 创建了一个大小为 10 的可变长数组，里面的值都初始化为 2
    vector<int> a4 = {1, 2, 3, 4, 5}; // 初始化列表的创建方式

    // <> 里面可以存放任意的数据类型，这就体现了模板的作用，也体现了模板的强大之处
    // 这样，vector里面就可以存放我们见过的所有的数据类型，甚至是 STL 本身
    vector<string> a5; // 存字符串
    vector<node> a6; // 存结构体
    vector<vector<int>> a7; // 创建了一个二维的可变长数组

    vector<int> a8[N]; // 创建了一个大小为 N 的 vector 数组
    // int a[N];

    // 2. size / empty
    // print
    // print(a2);
    // print(a3);
    // print(a4);

    // if(a2.empty()) cout << "空" << endl;
    // else cout << "不空" << endl;

    // 3. begin / end
    // print
    // print(a2);
    // print(a3);
    // print(a4);

    // 4. 尾插以及尾删
    // for(int i = 0; i < 5; i++)
    // {
    //     a1.push_back(i);
    //     print(a1);
    // }

    // while(!a1.empty())
    // {
    //     print(a1);
    //     a1.pop_back();
    // }

    // 5. front / back
    // cout << a4.front() << " " << a4.back() << endl;

    // 6. resize
    vector<int> aa(5, 1);
    print(aa);

    // 扩大成 10
    aa.resize(10);
    print(aa);

    // 缩小成 3
    aa.resize(3);
    print(aa);

    // 7. clear
    cout << aa.size() << endl;
    aa.clear();
    cout << aa.size() << endl;

    return 0;
}